/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.acionista.view;

import br.jm.acionista.base.eao.EaoException;
import br.jm.acionista.entity.*;
import br.jm.acionista.filter.Funcoes;
import br.jm.acionista.sistema.eao.*;
import java.io.Serializable;
import java.util.*;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.persistence.EntityManager;

/**
 *
 * @author joao
 */
public class FechamentoBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private Cautela selectedCautela;
    private CautelaAcionista selectedCautelaAcionista;
    private CautelaEao CautelaJpa;
    private CautelaAcionistaEao CautelaAcionistaJpa;
    private EditalCautela selectedEditalCautela;
    private EditalCautelaAcionista selectedEditalCautelaAcionista;
    private EditalCautelaEao EditalCautelaJpa;
    private EditalCautelaAcionistaEao EditalCautelaAcionistaJpa;
    private ClienteEao clienteJpa;
    private Livro selectedLivro;
    private LivroEao livroJpa;
    private List<Livro> livroList;
    private Cliente selectedCliente;
    private FacesMessage msg = null;
    private Funcoes funcoes = new Funcoes();
    private EntityManager sessao;
    private String cSql;
    private Empresa selectedEmpresa;
    private EmpresaEao empresaJpa;

    public FechamentoBean() {
        CautelaJpa = CautelaEao.getInstance();
        CautelaAcionistaJpa = CautelaAcionistaEao.getInstance();
        EditalCautelaJpa = EditalCautelaEao.getInstance();
        EditalCautelaAcionistaJpa = EditalCautelaAcionistaEao.getInstance();
        clienteJpa = ClienteEao.getInstance();
        livroJpa = LivroEao.getInstance();
        selectedCliente = new Cliente();
        selectedLivro = new Livro();
        selectedCautela = new Cautela();
        selectedCautelaAcionista = new CautelaAcionista();
        selectedEditalCautela = new EditalCautela();
        selectedEditalCautelaAcionista = new EditalCautelaAcionista();
        selectedEmpresa = new Empresa();
        empresaJpa = EmpresaEao.getInstance();

        livroList = new ArrayList<Livro>();
    }

    public void Fechamento(ActionEvent actionEvent) throws EaoException {
        try {
            livroList = livroJpa.getNative("Livro", 0, 1, null, true, null, null, "dat_fechamento is null");
            selectedLivro = new Livro();
            selectedLivro = livroList.get(0);
            // CALCULA OS DIA DE FECHAMENTO E ABERTURA

            String cDatFechamento = funcoes.ConverteDateString(selectedLivro.getDatAbertura());
            String cAnoFechamento = cDatFechamento.substring(6);
            cDatFechamento = "31/12/".concat(cAnoFechamento);

            int nAno = Integer.parseInt(cAnoFechamento) + 1;
            String cDatAbertura = "01/01/".concat(Integer.toString(nAno));

            Date datFechamento = funcoes.ConverteData(cDatFechamento);
            Date datAbertura = funcoes.ConverteData(cDatAbertura);

            this.sessao = clienteJpa.openSessaoLote();
            clienteJpa.openTransaction(this.sessao);
            selectedEmpresa = empresaJpa.getPorId(1, "S", this.sessao);


            int nLivro = Integer.parseInt(selectedLivro.getNumLivro());
            int nIdLivro = selectedLivro.getIdLivro();
            
            selectedLivro.setDatFechamento(datFechamento);
            livroJpa.edit(selectedLivro, "S", this.sessao);

            selectedLivro = new Livro();
            selectedLivro.setIdLivro(null);
            selectedLivro.setDatAbertura(datAbertura);
            selectedLivro.setNumLivro(Integer.toString(nLivro + 1));
            livroJpa.create(selectedLivro, "S", this.sessao);


            cSql = "delete from relatorio_livro";
            clienteJpa.executeUpdate(cSql, "S", this.sessao);

            cSql = "delete from relatorio_certificado";
            clienteJpa.executeUpdate(cSql, "S", this.sessao);

            cSql = "delete from relatorio_cautela";
            clienteJpa.executeUpdate(cSql, "S", this.sessao);

            cSql = "delete from relatorio_certificado_temp";
            clienteJpa.executeUpdate(cSql, "S", this.sessao);

            cSql = "delete from relatorio_livro_transferencia";
            clienteJpa.executeUpdate(cSql, "S", this.sessao);

            cSql = "delete from cautela_acionista";
            clienteJpa.executeUpdate(cSql, "S", this.sessao);

            cSql = "delete from cautela";
            clienteJpa.executeUpdate(cSql, "S", this.sessao);

            cSql = "delete from edital_cautela_acionista";
            clienteJpa.executeUpdate(cSql, "S", this.sessao);

            cSql = "delete from edital_cautela";
            clienteJpa.executeUpdate(cSql, "S", this.sessao);

            cSql = "delete from subscricao";
            clienteJpa.executeUpdate(cSql, "S", this.sessao);

            cSql = "delete from averbacao";
            clienteJpa.executeUpdate(cSql, "S", this.sessao);

            cSql = "delete from cliente_participacao";
            clienteJpa.executeUpdate(cSql, "S", this.sessao);

            cSql = "delete from cliente where qde_acao = 0";
            clienteJpa.executeUpdate(cSql, "S", this.sessao);

            cSql = "update cliente "
                    + "set perc_partic = (qde_acao / " + selectedEmpresa.getQdeTotal().toString()
                    + " ) * 100 "
                    + ", saldo_anterior = qde_acao, dat_saldo_anterior = '" + cDatFechamento + "' "
                    + ", num_folha = num_folha_atual , id_livro = " + nIdLivro;
            clienteJpa.executeUpdate(cSql, "S", this.sessao);

            CautelaJpa.closeTransaction(this.sessao);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Fechamento Anual efetuado com Sucesso!", "");
        } catch (Exception ex) {
            if (this.sessao.isOpen()) {
                clienteJpa.closeSessaoRollback(sessao);
            }
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Erro do Sistema... Entre em contato com o Administrador!", "");
        } finally {
            this.sessao = null;
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }
}
